import pytest
import ast
import allure
from utils.handle_excel import HandleExcel
from utils.handle_log import log,log_tojson

#选择测试模块
test_model ='all'

#获取测试用例
case_list = HandleExcel(test_model).get_all_data()
log.info(msg="excel读取的测试用例：\n{}".format(log_tojson(case_list)))

#实例化业务逻辑

@pytest.mark.usefixtures('init')
class TestAll:
    @allure.feature('全流程业务接口测试')
    @pytest.mark.parametrize('case',case_list)
    def test_all(self,init,case):
        log.info(msg="单个测试用例：\n{}".format(log_tojson(case)))
        self.send_request, self.handle_phone, self.handle_replace, self.handle_extract,self.handle_checkDB = init

        # 1、请求参数替换
        new_request_data = self.handle_replace.replace_request_data(request_data=case["data"],replace_request_data=case["replace_request_data"])

        # 2、发起请求
        response = self.send_request.send_request(method=case["method"],uri=case["uri"],data=new_request_data)

        # 3、获取token，依赖参数
        # 调用提取提取表达式的方法，设置全局变量
        self.handle_extract.handle_extract(response=response,extract_data=case["extract_data"])

        # 4、响应参数替换
        actual_data = {'code': response['code'], 'message': response['message']}

        # 5、响应断言
        assert ast.literal_eval(case['expected_data']) == actual_data

        # 6、sql参数替换 并将查询到的数据库信息保存为全局变量供后续请求做参数替换
        self.handle_checkDB.check_db(check_db=case["check_db"], replace_check_sql=case["replace_check_sql"],expected_check_result=case["expected_check_result"])

if __name__ == '__main__':
    pytest.main()